package com.susallwave.srcb.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 的拦截器
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 对全局请求进行登录校验
            SaRouter.match("/**")  // 匹配所有路径
                    .notMatch(         // 排除不需要登录的接口
                            "/user/login",    // 登录接口
                            "/user/lock/**",
                            "/user/unlock/**",   //管理员解锁
                            "/user/loginBySign",//链接免密登陆
                            "/schedule/run/**", //定时任务
                            // Swagger 相关
                            "/",
                            "/csrf",
                            "/swagger-ui.html",
                            "/swagger-ui/**",
                            "/swagger-resources/**",
                            "/v2/api-docs",
                            "/v3/api-docs",
                            "/webjars/**",
                            "/favicon.ico"
                    )
                    .check(r -> StpUtil.checkLogin()); // 检查是否登录
        })).addPathPatterns("/**"); // 拦截所有路径
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 为匹配 "/api/**" 路径的请求配置 CORS 规则
        registry.addMapping("/**")
                // 允许来自 "https://app.yourdomain.com" 的跨域请求
                .allowedOrigins("*")
                // 允许的 HTTP 方法：GET, POST, PUT, DELETE, OPTIONS
                .allowedMethods("*")
                // 允许的请求头：Content-Type, Authorization, X-Requested-With
                .allowedHeaders("Content-Type", "Authorization", "X-Requested-With")
                // 暴露给客户端的响应头：X-CSRF-TOKEN, X-Refresh-Token
                .exposedHeaders("X-CSRF-TOKEN", "X-Refresh-Token")
                // 允许发送凭据（如 cookies）
//                .allowCredentials(true)
                // 预检请求的缓存时间（秒）
                .maxAge(3600);

    }
}
